package com.meizi.codegenerate.utils;

import com.meizi.codegenerate.constant.TableNameConstant;
import org.apache.commons.lang3.StringUtils;

/**
 * @author Administration
 * @date 2022/11/2 - 11:24 - 星期三
 * @project lambda
 * @package com.meizi.codegenerate.utils
 * @by 晨
 */

/**
 * 属性转换工具
 */
public class AttributeConvertUtils {

    /**
     * 表名转换成Java类名
     */
    public static String tableNameToJava(String tableName, String tablePrefix, boolean firstIsUpperCase) {
        // 判断是否有前缀 需要去除表明对应得前缀
        if(StringUtils.isNotBlank(tablePrefix)){
            tableName = tableName.replaceFirst(tablePrefix, "");
        }

        return transformation(tableName, firstIsUpperCase);
    }

    /**
     * 列名转换成Java实体属性
     */
    public static String columnNameToJava(String columnName, String tablePrefix, boolean firstIsUpperCase) {
        // 判断是否有前缀 需要去除表明对应得前缀
        if(StringUtils.isNotBlank(tablePrefix)){
            columnName = columnName.replaceFirst(tablePrefix, "");
        }

        return transformation(columnName, firstIsUpperCase);
    }

    /**
     * 表名转换成Java方法名
     */
    public static String methodNameToJava(String methodName, String tablePrefix, boolean firstIsUpperCase) {
        // 判断是否有前缀 需要去除表明对应得前缀
        if(StringUtils.isNotBlank(tablePrefix)){
            methodName = methodName.replaceFirst(tablePrefix, "");
        }

        return transformation(methodName, firstIsUpperCase);
    }

    /**
     * 下划线转换为驼峰
     *
     * @param line 下划线字符串
     * @param firstIsUpperCase 首字母是否转换为大写
     * @return
     */
    private static String transformation(String line, boolean firstIsUpperCase) {
        String str = "";

        if (StringUtils.isBlank(line)) {
            return str;
        } else {
            StringBuilder sb = new StringBuilder();
            String[] strArr;
            // 是否包含下划线 首字母转大写
            if (line.contains(TableNameConstant.LOWER_SCRIBING) && firstIsUpperCase) {
                strArr = line.split(TableNameConstant.LOWER_SCRIBING);
                // 截取第一下字母转大写 在拼接剩下得字符
                for (String s : strArr) {
                    sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
                }
                str = sb.toString();
                // 不包含下划线 首字母转大写

            } else if (!line.contains(TableNameConstant.LOWER_SCRIBING) && firstIsUpperCase) {
                sb.append(line.substring(0, 1).toUpperCase()).append(line.substring(1));
                str = sb.toString();

                // 包含下划线 首字母转小写第二个首字母大写
            } else if (line.contains(TableNameConstant.LOWER_SCRIBING) && !firstIsUpperCase) {
                strArr = line.split(TableNameConstant.LOWER_SCRIBING);
                for (String s : strArr) {
                    sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
                }
                str = sb.toString();
                str = str.substring(0, 1).toLowerCase() + str.substring(1);

                // 不包含下划线 首字母转小写第二个首字母大写
            } else if (!line.contains(TableNameConstant.LOWER_SCRIBING) && !firstIsUpperCase) {
                strArr = line.split(TableNameConstant.LOWER_SCRIBING);
                for (String s : strArr) {
                    sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
                }
                str = sb.toString();
                str = str.substring(0, 1).toLowerCase() + str.substring(1);
            }
        }
        return str;
    }
}
